package org.bwf.study.util;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.*;
import java.util.stream.Collectors;

/**
 * JWT工具类
 *
 * @author jitwxs
 * @since 2018/5/2 18:49
 */
public class JwtUtils {
    // 签名密钥（高度保密）
    private static final String SECRET = "qYYjXt7s1C*nEC%9RCwQGFA$YwPr$Jrj";
    // 签名算法
    private static final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512;
    // token前缀
    private static final String TOKEN_PREFIX = "Bearer ";

    /**
     * 生成JWT token
     *
     * @param map    传入数据
     * @param maxAge 有效期（单位：ms）
     * @author jitwxs
     * @since 2018/5/3 23:19
     */
    public static String sign(Map<String, Object> map, long maxAge) {
        return sign(map, null, null, maxAge);
    }

    /**
     * 生成JWT token
     *
     * @param map     传入数据
     * @param issuer  签发者
     * @param subject 面向用户
     * @param maxAge  有效期（单位：ms）
     * @author jitwxs
     * @since 2018/5/3 23:19
     */
    public static String sign(Map<String, Object> map, String issuer, String subject, long maxAge) {
        Date now = new Date(System.currentTimeMillis());
        String jwt = Jwts.builder()
                .setClaims(map) // 设置自定义数据
                .setIssuedAt(now) // 设置签发时间
                .setExpiration(new Date(now.getTime() + maxAge)) // 设置过期时间
                .setIssuer(issuer) // 设置签发者
                .setSubject(subject) // 设置面向用户
                .signWith(signatureAlgorithm, SECRET)
                .compact();
        return TOKEN_PREFIX + jwt;
    }

    /**
     * 验证JWT token并返回数据。当验证失败时，抛出异常
     *
     * @author jitwxs
     * @since 2018/5/3 23:20
     */
    public static Map unSign(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(SECRET)
                    .parseClaimsJws(token.replace(TOKEN_PREFIX, ""))
                    .getBody();
        } catch (Exception e) {
            throw new IllegalStateException("Token验证失败：" + e.getMessage());
        }
    }

    public static void main(String[] args) {
//        Map<String,Object> map = new HashMap<>();
//        map.put("userId","1");
////        map.put("userLoginName","1213212121321");
////
//        String token = JwtUtils.sign(map, 3600_000);
//        System.out.println(token);
////        String token = JwtUtils.sign(map, "jitwxs","普通用户",3600_000);
//        System.out.println(JwtUtils.unSign(token));

//        List<Integer> tmpList = new ArrayList<>();
//        tmpList.add(1);
//        tmpList.add(10);
//        tmpList.add(4);
//        tmpList.add(9);
//        tmpList.add(15);
//        tmpList.add(21);
//
//        // 过滤 数值大于 9的元素
//        List<Integer> tmpList2 = tmpList.stream().filter(l -> l > 9).collect(Collectors.toList());

        Person p = new Person();
        p.setPerAge(20);
        p.setPerName("张飞");
        Person p1 = new Person();
        p1.setPerAge(30);
        p1.setPerName("刘备");
        Person p2 = new Person();
        p2.setPerAge(40);
        p2.setPerName("关羽");
        List<Person> personList = new ArrayList<>();
        personList.add(p);
        personList.add(p1);
        personList.add(p2);

        List<Person> personList1 = personList.stream().filter(person -> person.getPerAge()>20).collect(Collectors.toList());

    }

}




